from selenium import webdriver
from Configs.env import Env
from typing import List, Tuple, Dict, Union, Optional, Any, Callable, Iterable, TypeVar, Generic

...
""" 本代码知识点
1. 参考　以下模块的做法　对模块和类进行命名
　　keys.py  Keys
   by.py    By

2. 单例模式
    案例
    2.1 loguru 
    2.2 None  就是一个单例
    2.3 小整数  小字符串(缓存)
    背后的原理
    __new__  返回 一个 实例
    __init__  用的就是__new__返回
    单例的实现方式有很多种
"""


class  Singleton:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'_instance'): # 这个字符串不能__ 开头
            # 第一次判断  不具备该属性 _instance
            # 走 if  生成 cls._instance
            # 第二次 已有  cls._instance 就不会再产生 新的 cls._instance
            cls._instance = super().__new__(cls, *args, **kwargs)
        return cls._instance
        
class Comm_Driver(Singleton):

    driver = None
    def get_driver(self,
                   browser_type=Env.BROWSER_TYPE,
                   headless_flag=Env.HEADLESS_FLAG):
        if self.driver is None:
            if not headless_flag:
                if browser_type == 'chrome':
                    self.driver = webdriver.Chrome()
                elif browser_type == 'firefox':
                    self.driver = webdriver.Firefox()
            else:
                if browser_type == 'chrome':
                    _option = webdriver.ChromeOptions()
                    _option.add_argument('--headless')
                    self.driver = webdriver.Chrome(options=_option)
                elif browser_type == 'firefox':
                    _option = webdriver.FirefoxOptions()
                    _option.add_argument('--headless')
                    self.driver = webdriver.Firefox(options=_option)
        self.driver.maximize_window()
        self.driver.set_page_load_timeout(Env.PAGE_LOAD_TIMEOUT)
        return self.driver
    
    

if __name__ == '__main__':
    test_flag = 1

    if test_flag == 3:
        d1 = Comm_Driver().get_driver()
        d2 = Comm_Driver().get_driver()
        print(d1 is d2 )
        print('test_flag == 3') # False # True加了一个driver = None  if self.driver is None:
    if test_flag == 2:
        c1 = Comm_Driver()
        c2 = Comm_Driver()
        print(c1 is c2 )
        print('test_flag == 2')
    if test_flag ==1:
        s1 = Singleton()
        s2 = Singleton()
        print(id(s1)==id(s2))
        print('test_flag == 1')

